
package Clases;

/**
 *
 * @author Pavilion
 */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import Clases.Usuario;
import Clases.ConectarBD;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Boletas {
    private int mes;
    private int anio;
    private int mora;
    private float monto1;
    private String monto1String;
    private float monto2;
    private String monto2String;
    private float montoactualizado;
    private String montoActualizadoString;
    private String vencimiento1;
    private String vencimiento2;
    private String periodo;
    private int id_inmueble;
    private int id_boleta;
    private Date vto1;
    private Date vto2;

    public Boletas() { }

    public int getMes () {
        return mes;
    }

    public void setMes (int value) {
        this.mes=value;
    }

    public int getAnio () {
        return anio;
    }

    public void setAnio (int value) {
        this.anio=value;
    }

    public String getMonto1String() {
       DecimalFormat fd = new DecimalFormat ("#,##0.00");
       String monto1Format = fd.format(monto1);
       return monto1Format;
    }

    public float getMonto1 () {
        return monto1;
    }

    public void setMonto1 (float value) {
        this.monto1=value;
    }

    public int getMora () {
        return mora;
    }

    public void setMora (int value) {
        this.mora=value;
    }    
    public String getMontoActualizadoString() {
       DecimalFormat fd = new DecimalFormat ("#,##0.00");
       String montoactualizadoFormat = fd.format(montoactualizado);
       return montoactualizadoFormat;
    }

    public float getMontoActualizado () {
        return montoactualizado;
    }

    public void setMontoActualizado (float value) {
        this.montoactualizado=value;
    }

   public String getMonto2String() {
       DecimalFormat fd = new DecimalFormat ("#,##0.00");
       String monto2Format = fd.format(monto2);
       return monto2Format;
    }

    public float getMonto2 () {
        return monto2;
    }

    public void setMonto2 (float value) {
        this.monto2=value;
    }

    public String getVencimiento1 () {
        return vencimiento1;
    }

    public void getVencimiento1 (String value) {
        this.vencimiento1=value;
    }

    public String getPeriodo () {
        return periodo;
    }

    public void setPeriodo (String value) {
        this.periodo=value;
    }   
    
    public String getVencimiento2 () {
        return vencimiento2;
    }

    public void getVencimiento2 (String value) {
        this.vencimiento2=value;
    }

    public int getIDInmueble () {
        return id_inmueble;
    }

    public void setIDInmueble (int value) {
        this.id_inmueble=value;
    }

    public int getIDBoleta () {
        return id_boleta;
    }

    public void setIDBoleta (int value) {
        this.id_boleta=value;
    }
    
    public void cargarResumen (int ID){
        int status;
        int difanio;
        int difmes = 0;
        float monto2;
        
        Calendar cal = Calendar.getInstance(); // current date
        int currYear = cal.get(Calendar.YEAR);
        int currMonth = cal.get(Calendar.MONTH);        
        Connection miConexion = ConectarBD.getConnection();
        ResultSet miRs = null;
        String miQuery = "select periodo_mes, periodo_anio, monto1, vencimiento1 from impuesto_inmuebles where id_impuesto_inmueble=?" ;
        try {
            PreparedStatement miStm = (PreparedStatement) miConexion.prepareStatement(miQuery);
            miStm.setInt(1, ID);
            miRs = miStm.executeQuery();
                if (miRs.next())
                {
                           DecimalFormat fd = new DecimalFormat ("00");
                           this.mes = miRs.getInt("periodo_mes");
                           this.anio = miRs.getInt("periodo_anio");
                           this.periodo=mes+"/"+anio;                             
                           this.monto1 = miRs.getFloat("monto1");
                           this.monto1String=this.getMonto1String();
                           if ((currYear > anio) && ((currYear - anio)>1)) {
                               difanio = currYear - anio + 1;
                               difmes = (difanio*12) + (currMonth+1) + (12 - mes);                               
                           }else if ((currYear > anio) && ((currYear - anio)==1)){
                               difmes = (12-mes) + (currMonth+1);
                           }else if (currYear == anio){
                               difmes = (currMonth+1) - mes;
                           } 
                           montoactualizado = (float) (monto1 + difmes*0.03*monto1);
                           SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                           String vto1Format = df.format(miRs.getDate("vencimiento1"));
                           this.vencimiento1=vto1Format;                           
                           this.montoactualizado = montoactualizado;
                           this.montoActualizadoString=this.getMontoActualizadoString();
                           this.mora=difmes;
                           status = 0;
                }else status = 1;

        }
        catch (SQLException ex)
        {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
         }
    }

     public void cargarListaBoletas (int ID){
        int status;
        int difanio;
        int difmes = 0;
        float monto2;

        Calendar cal = Calendar.getInstance(); // current date
        int currYear = cal.get(Calendar.YEAR);
        int currMonth = cal.get(Calendar.MONTH);           
        Connection miConexion = ConectarBD.getConnection();
        ResultSet miRs = null;
        String miQuery = "select * from impuesto_inmuebles where id_impuesto_inmueble=?" ;
        try {
            PreparedStatement miStm = (PreparedStatement) miConexion.prepareStatement(miQuery);
            miStm.setInt(1, ID);
            miRs = miStm.executeQuery();
                if (miRs.next())
                {
                           this.id_boleta=miRs.getInt("id_impuesto_inmueble");
                           this.mes = miRs.getInt("periodo_mes");
                           this.anio = miRs.getInt("periodo_anio");                           
                           this.periodo=mes+" / "+anio;
                           DecimalFormat fd = new DecimalFormat ("00");
                           String mesFormat = fd.format(miRs.getInt("periodo_mes"));
                           this.monto1 = miRs.getFloat("monto1");
                           this.monto1String=this.getMonto1String();
                           if ((currYear > anio) && ((currYear - anio)>1)) {
                               difanio = currYear - anio + 1;
                               difmes = (difanio*12) + (currMonth+1) + (12 - mes);                               
                           }else if ((currYear > anio) && ((currYear - anio)==1)){
                               difmes = (12-mes) + (currMonth+1);
                           }else if (currYear == anio){
                               difmes = (currMonth+1) - mes;
                           } 
                           montoactualizado = (float) (monto1 + difmes*0.03*monto1);                           
                           this.montoactualizado = montoactualizado;
                           this.montoActualizadoString=this.getMontoActualizadoString(); 
                           cal.add(Calendar.DAY_OF_MONTH, 10);
                           java.util.Date vto1 = cal.getTime();
                           cal.add(Calendar.DAY_OF_MONTH, 10);
                           java.util.Date vto2 = cal.getTime();
                           SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                           String vto1Format = df.format(vto1.getTime());
                           this.vencimiento1=vto1Format;
                           monto2 = (float) (montoactualizado + (montoactualizado*0.02));
                           this.monto2 = monto2;
                           this.monto2String=this.getMonto2String();
                           String vto2Format = df.format(vto2.getTime());
                           this.vencimiento2=vto2Format;
                           status = 0;
                }
                else status = 1;
        }
        catch (SQLException ex)
        {
            Logger.getLogger(Propiedades.class.getName()).log(Level.SEVERE, null, ex);
         }
    }   
                   
                           
public int BuscarIDBoleta(String per){
        
        int idBol = 0;
        Connection miCnx = ConectarBD.getConnection();
        String query = "SELECT idboleta FROM temporal WHERE periodo=?";
        ResultSet miRs = null;
        try {
            PreparedStatement miStm = (PreparedStatement) miCnx.prepareStatement(query);
            miStm.setString(1, per);
            miRs = miStm.executeQuery();
            miRs.next();           
            idBol = miRs.getInt("idboleta");
        } catch (SQLException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        }
       return idBol;
    }    

    
public int CargarBoleta(String per){
    
    int id = BuscarIDBoleta(per);    
    return id;
    } 


public Integer[] buscar_deudas(int ID){    
        
        ArrayList<Integer> lista = new ArrayList<Integer >();
        ResultSet miRs = null;
        Connection miCnx = ConectarBD.getConnection();
        String query = "select * from impuesto_inmuebles where id_inmueble=? and estado=0";
        try {
            PreparedStatement miStm = (PreparedStatement) miCnx.prepareStatement(query);
            miStm.setInt(1, ID);        
            miRs = miStm.executeQuery();
            int i = 0;
            while(miRs.next()){                  
                  this.id_boleta=miRs.getInt("id_impuesto_inmueble");            
                  this.mes = miRs.getInt("periodo_mes");
                  this.anio = miRs.getInt("periodo_anio");
                  this.periodo=mes+"/"+anio;
                  lista.add(new Integer(id_boleta));
            }            
          } catch (SQLException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        } 
         Integer [] list = new Integer[lista.size()];
         list = lista.toArray(list);
        return list;
        }    

public Object[][] mostrarLista(String ID){    
        
        Crear_Temporal();
        ArrayList<Object []> lista= new ArrayList<Object []>();
        int IDInmueble = Integer.parseInt(ID);         
        Connection miCnx = ConectarBD.getConnection();        
        String query = "select * from impuesto_inmuebles where (id_inmueble=? and estado=0)"; 
        ResultSet miRs = null; 
        try {
            PreparedStatement miStm = (PreparedStatement) miCnx.prepareStatement(query);
            miStm.setInt(1, IDInmueble);
            miRs = miStm.executeQuery();          
            int i = 0;
            while(miRs.next()){                  
                  this.id_boleta=miRs.getInt("id_impuesto_inmueble");            
                  this.mes = miRs.getInt("periodo_mes");
                  this.anio = miRs.getInt("periodo_anio");
                  this.periodo=mes+"/"+anio;
                  Object [] data = new Object[]{id_boleta, periodo};
                  lista.add(data);
            }
            }catch (Exception e){
               System.out.println("No se puede cargar la lista");
            }
        
           Object [][] listaOb = new Object [lista.size()][];
           int i=0;
           Connection miCnx2 = ConectarBD.getConnection();          
           String query2 = "INSERT INTO temporal (indice, idboleta, periodo) values (?,?,?)";           
           for (Object [] ob : lista ) { 
            try{
               PreparedStatement miStm2 = (PreparedStatement) miCnx2.prepareStatement(query2);  
               listaOb[i]=ob ;
               miStm2.setInt(1, i);   
               Integer integer = (Integer)ob[0];
               miStm2.setInt(2, integer.intValue());
               miStm2.setString(3, (String)ob[1]);
               int status = miStm2.executeUpdate();
               i++;            
            }catch (SQLException ex) {
                Logger.getLogger(Propiedades.class.getName()).log(Level.SEVERE, null, ex);
            }
           }
           return listaOb;
        }   

public void Crear_Temporal(){
        
        int i=0;
        Connection miCnx = ConectarBD.getConnection();        
        String query = "drop table municipalidad.temporal"; 
        try {
            PreparedStatement miStm = (PreparedStatement) miCnx.prepareStatement(query);
            i = miStm.executeUpdate();          
            }catch (Exception e){
               System.out.println("la tabla no se pudo borrar.");
            }
        String query1 = "CREATE  TABLE municipalidad.temporal (id INT(11) NOT NULL AUTO_INCREMENT, indice INT(11) NULL DEFAULT NULL, idboleta INT(11) NULL DEFAULT NULL, periodo VARCHAR(45) NULL DEFAULT NULL, PRIMARY KEY (id))";
        try {
            PreparedStatement miStm = (PreparedStatement) miCnx.prepareStatement(query1);
            i = miStm.executeUpdate();          
            }catch (Exception e){
               System.out.println("la tabla no se pudo crear.");
            }
}

}